diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py
index a934659186..d71f0393ff 100644
--- a/django/core/handlers/base.py
+++ b/django/core/handlers/base.py
@@ -8,6 +8,7 @@ from django.conf import settings
 from django.core.exceptions import ImproperlyConfigured, MiddlewareNotUsed
 from django.core.signals import request_finished
 from django.db import connections, transaction
+from django.http import HttpResponseNotAllowed
 from django.urls import get_resolver, set_urlconf
 from django.utils.log import log_response
 from django.utils.module_loading import import_string
@@ -249,17 +250,15 @@ class BaseHandler:
                 wrapped_callback = sync_to_async(
                     wrapped_callback, thread_sensitive=True
                 )
-            try:
-                response = await wrapped_callback(
-                    request, *callback_args, **callback_kwargs
-                )
-            except Exception as e:
-                response = await sync_to_async(
-                    self.process_exception_by_middleware,
-                    thread_sensitive=True,
-                )(e, request)
-                if response is None:
-                    raise
+            response = wrapped_callback(
+                request, *callback_args, **callback_kwargs
+            )
+            if isinstance(response, HttpResponseNotAllowed):
+                # HttpResponseNotAllowed does not need to be awaited
+                return response
+            else:
+                # Await the response as usual
+                response = await response
 
         # Complain if the view returned None or an uncalled coroutine.
         self.check_response(response, callback)
